今天來聊聊抽樣方法。如果你現在僅有一枚不公正的硬幣,比方說,投擲硬幣出現正面的機率是 p,那麼要如何使用這麼一枚不公正的硬幣來模擬一枚公正的硬幣呢?
我們可以有個簡單的方法來實做它:比方說,利用這個不公正的硬幣,進行多次投擲實驗,並且在實驗中找出兩個出現機率相等的互斥事件 (disjoint event)。其中一個我們就解讀為『正面』、另一個事件我們則解讀為『反面』,對於其他實驗結果,我們解讀為『拒絕』(rejection)、我們可以重新進行實驗。根據條件機率,此時回傳的『正面』和『反面』的機率相同。
舉例來說,我們考慮以下機率實驗:每一次投擲兩枚硬幣,若出現先正後反,我們就回傳『正面』。若出現先反後正,我們就回傳『反面』。若出現其他情形則『拒絕』並重來。
# 一次實驗
def simulate_fair_coin(p = 0.7):
while True:
c1 = np.random.choice(["HEAD", "TAIL"], p=[p, 1-p])
c2 = np.random.choice(["HEAD", "TAIL"], p=[p, 1-p])
if c1 != c2:
return c1
# 設定實驗次數
rep = 10000
# 設定不公正的硬幣,擲出正面的機率
p = 0.7
results = [simulate_fair_coin(p) for _ in range(rep)]
# 把結果繪製出來
plt.figure(figsize=(8, 1))
plt.barh(*np.unique(results, return_counts=True))
ax = plt.gca()
ax.bar_label(ax.containers[0], label_type='edge')
ax.set_title(f"p = {p}")
plt.show()
這個之後再補。